/** * Copyright (c) 2009 * Philipp Giese, Sven Wagner-Boysen * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package de.hpi.bpmn2_0.model.activity; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; import javax.xml.bind.annotation.XmlIDREF; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import de.hpi.bpmn2_0.model.FlowNode; import de.hpi.bpmn2_0.model.activity.loop.LoopCharacteristics; import de.hpi.bpmn2_0.model.activity.loop.MultiInstanceLoopCharacteristics; import de.hpi.bpmn2_0.model.activity.loop.StandardLoopCharacteristics; import de.hpi.bpmn2_0.model.activity.resource.ActivityResource; import de.hpi.bpmn2_0.model.activity.resource.HumanPerformer; import de.hpi.bpmn2_0.model.activity.resource.Performer; import de.hpi.bpmn2_0.model.activity.resource.PotentialOwner; import de.hpi.bpmn2_0.model.connector.DataInputAssociation; import de.hpi.bpmn2_0.model.connector.DataOutputAssociation; import de.hpi.bpmn2_0.model.data_object.DataInput; import de.hpi.bpmn2_0.model.data_object.DataOutput; import de.hpi.bpmn2_0.model.data_object.InputOutputSpecification; import de.hpi.bpmn2_0.model.data_object.InputSet; import de.hpi.bpmn2_0.model.data_object.OutputSet; import de.hpi.bpmn2_0.model.event.BoundaryEvent; import de.hpi.bpmn2_0.model.extension.PropertyListItem; import de.hpi.bpmn2_0.model.misc.IoOption; import de.hpi.bpmn2_0.model.misc.Property; import de.hpi.bpmn2_0.transformation.Visitor; import de.hpi.diagram.SignavioUUID; /** * <p>Java class for tActivity complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType name="tActivity"> * <complexContent> * <extension base="{http://www.omg.org/bpmn20}tFlowNode"> * <sequence> * <element ref="{http://www.omg.org/bpmn20}ioSpecification" minOccurs="0"/> * <element ref="{http://www.omg.org/bpmn20}property" maxOccurs="unbounded" minOccurs="0"/> * <element ref="{http://www.omg.org/bpmn20}dataInputAssociation" maxOccurs="unbounded" minOccurs="0"/> * <element ref="{http://www.omg.org/bpmn20}dataOutputAssociation" maxOccurs="unbounded" minOccurs="0"/> * <element ref="{http://www.omg.org/bpmn20}activityResource" maxOccurs="unbounded" minOccurs="0"/> * <element ref="{http://www.omg.org/bpmn20}loopCharacteristics" minOccurs="0"/> * </sequence> * <attribute name="isForCompensation" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" /> * <attribute name="startQuantity" type="{http://www.w3.org/2001/XMLSchema}integer" default="1" /> * <attribute name="completionQuantity" type="{http://www.w3.org/2001/XMLSchema}integer" default="1" /> * <attribute name="default" type="{http://www.w3.org/2001/XMLSchema}IDREF" /> * </extension> * </complexContent> * </complexType> * </pre> * * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "tActivity", propOrder = { "ioSpecification", "property", "dataInputAssociation", "dataOutputAssociation", "activityResource", "loopCharacteristics", "additionalProperties" }) @XmlSeeAlso({ SubProcess.class, Transaction.class, Task.class, CallActivity.class }) public abstract class Activity extends FlowNode { protected InputOutputSpecification ioSpecification; protected List<Property> property; @XmlElement(name = "dataInputAssociation", type = DataInputAssociation.class) protected List<DataInputAssociation> dataInputAssociation; @XmlElement(name = "dataOutputAssociation", type = DataOutputAssociation.class) protected List<DataOutputAssociation> dataOutputAssociation; @XmlElementRefs({ @XmlElementRef(type = ActivityResource.class), @XmlElementRef(type = Performer.class), @XmlElementRef(type = HumanPerformer.class), @XmlElementRef(type = PotentialOwner.class) }) protected List<ActivityResource> activityResource; @XmlElementRefs({ @XmlElementRef(type = StandardLoopCharacteristics.class), @XmlElementRef(type = MultiInstanceLoopCharacteristics.class) }) protected LoopCharacteristics loopCharacteristics; // @XmlIDREF // @XmlElement(name = "boundaryEventRef", type = BoundaryEvent.class) @XmlTransient protected List<BoundaryEvent> boundaryEventRefs; @XmlAttribute protected Boolean isForCompensation; @XmlAttribute protected BigInteger startQuantity; @XmlAttribute protected BigInteger completionQuantity; @XmlAttribute(name = "default") @XmlIDREF @XmlSchemaType(name = "IDREF") protected Object _default; @XmlElementRef protected List<PropertyListItem> additionalProperties; @XmlTransient private List<HashMap<String, IoOption>> inputSetInfo; @XmlTransient private List<HashMap<String, IoOption>> outputSetInfo; @XmlTransient private List<BoundaryEvent> attachedBoundaryEvents; /** * Default constructor */ public Activity() { } /** * Copy constructor * * @param act * The {@link Activity} to copy */ public Activity(Activity act) { super(act); if(act.getProperty().size() > 0) this.getProperty().addAll(act.getProperty()); if(act.getDataInputAssociation().size() > 0) this.getDataInputAssociation().addAll(act.getDataInputAssociation()); if(act.getDataOutputAssociation().size() > 0) this.getDataOutputAssociation().addAll(act.getDataOutputAssociation()); if(act.getActivityResource().size() > 0) this.getActivityResource().addAll(act.getActivityResource()); if(act.getBoundaryEventRefs().size() > 0) this.getBoundaryEventRefs().addAll(act.getBoundaryEventRefs()); if(act.getInputSetInfo().size() > 0) this.getInputSetInfo().addAll(act.getInputSetInfo()); if(act.getOutputSetInfo().size() > 0) this.getOutputSetInfo().addAll(act.getOutputSetInfo()); if(act.getAdditionalProperties().size() > 0) { this.getAdditionalProperties().addAll(act.getAdditionalProperties()); } this.setIoSpecification(act.getIoSpecification()); this.setLoopCharacteristics(act.getLoopCharacteristics()); this.setIsForCompensation(act.isForCompensation); this.setStartQuantity(act.getStartQuantity()); this.setCompletionQuantity(act.getCompletionQuantity()); this.setDefault(act.getDefault()); } /* Transformation logic methods */ /** * Determines and sets the {@link InputOutputSpecification} of an activity. * * Per default there exists exactly one {@link InputSet} and one {@link OutputSet}. * All input and output data objects are associated by theses sets. Both * sets are linked towards each other to define a default IORule. */ public void determineIoSpecification() { /* Process data inputs */ InputSet inputSet = new InputSet(); inputSet.setName("DefaultInputSet"); inputSet.setId(SignavioUUID.generate()); for(DataInputAssociation dia : this.getDataInputAssociation()) { if(dia.getSourceRef() instanceof DataInput) { DataInput input = (DataInput) dia.getSourceRef(); for(HashMap<String, IoOption> inputSetDesc : this.getInputSetInfo()) { IoOption opt = inputSetDesc.get(input.getName()); if(opt != null) { /* Append to appropriate list of data inputs */ inputSet.getDataInputRefs().add(input); if(opt.isOptional()) inputSet.getOptionalInputRefs().add(input); if(opt.isWhileExecuting()) inputSet.getWhileExecutingInputRefs().add(input); } } } } /* Process data outputs */ OutputSet outputSet = new OutputSet(); outputSet.setName("DefaultOutputSet"); outputSet.setId(SignavioUUID.generate()); for(DataOutputAssociation dia : this.getDataOutputAssociation()) { if(dia.getTargetRef() instanceof DataOutput) { DataOutput output = (DataOutput) dia.getTargetRef(); for(HashMap<String, IoOption> outputSetDesc : this.getOutputSetInfo()) { IoOption opt = outputSetDesc.get(output.getName()); if(opt != null) { /* Append to appropriate list of data inputs */ outputSet.getDataOutputRefs().add(output); if(opt.isOptional()) outputSet.getOptionalOutputRefs().add(output); if(opt.isWhileExecuting()) outputSet.getWhileExecutingOutputRefs().add(output); } } } } /* Link both sets against each other to specifies a default IORule and * dependency between them. */ inputSet.getOutputSetRefs().add(outputSet); outputSet.getInputSetRefs().add(inputSet); /* Add input set to specification */ if(inputSet.getDataInputRefs().size() > 0 && outputSet.getDataOutputRefs().size() > 0) { InputOutputSpecification ioSpec = new InputOutputSpecification(); ioSpec.setId(SignavioUUID.generate()); ioSpec.getInputSet().add(inputSet); ioSpec.getOutputSet().add(outputSet); ioSpec.getDataInput(); ioSpec.getDataOutput(); this.setIoSpecification(ioSpec); } } /* Getter & Setter */ public List<PropertyListItem> getAdditionalProperties() { if(additionalProperties == null) { additionalProperties = new ArrayList<PropertyListItem>(); } return additionalProperties; } /** * @return The list of boundary event references */ public List<BoundaryEvent> getBoundaryEventRefs() { if(this.boundaryEventRefs == null) { this.boundaryEventRefs = new ArrayList<BoundaryEvent>(); } return this.boundaryEventRefs; } /** * Gets the value of the ioSpecification property. * * @return * possible object is * {@link InputOutputSpecification } * */ public InputOutputSpecification getIoSpecification() { return ioSpecification; } /** * Sets the value of the ioSpecification property. * * @param value * allowed object is * {@link InputOutputSpecification } * */ public void setIoSpecification(InputOutputSpecification value) { this.ioSpecification = value; } /** * Gets the value of the property property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the property property. * * <p> * For example, to add a new item, do as follows: * <pre> * getProperty().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link Property } * * */ public List<Property> getProperty() { if (property == null) { property = new ArrayList<Property>(); } return this.property; } /** * Gets the value of the dataInputAssociation property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the dataInputAssociation property. * * <p> * For example, to add a new item, do as follows: * <pre> * getDataInputAssociation().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link DataInputAssociation } * * */ public List<DataInputAssociation> getDataInputAssociation() { if (dataInputAssociation == null) { dataInputAssociation = new ArrayList<DataInputAssociation>(); } return this.dataInputAssociation; } /** * Gets the value of the dataOutputAssociation property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the dataOutputAssociation property. * * <p> * For example, to add a new item, do as follows: * <pre> * getDataOutputAssociation().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link DataOutputAssociation } * * */ public List<DataOutputAssociation> getDataOutputAssociation() { if (dataOutputAssociation == null) { dataOutputAssociation = new ArrayList<DataOutputAssociation>(); } return this.dataOutputAssociation; } /** * Gets the value of the activityResource property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the activityResource property. * * <p> * For example, to add a new item, do as follows: * <pre> * getActivityResource().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@code <}{@link HumanPerformer }{@code >} * {@code <}{@link Performer }{@code >} * {@code <}{@link PotentialOwner }{@code >} * {@code <}{@link ActivityResource }{@code >} * * */ public List<ActivityResource> getActivityResource() { if (activityResource == null) { activityResource = new ArrayList<ActivityResource>(); } return this.activityResource; } /** * Gets the value of the loopCharacteristics property. * * @return * possible object is * {@ link MultiInstanceLoopCharacteristics } * {@link LoopCharacteristics } * {@link StandardLoopCharacteristics } * */ public LoopCharacteristics getLoopCharacteristics() { return loopCharacteristics; } /** * Sets the value of the loopCharacteristics property. * * @param value * allowed object is * {@ link MultiInstanceLoopCharacteristics } * {@link LoopCharacteristics } * {@link StandardLoopCharacteristics } * */ public void setLoopCharacteristics(LoopCharacteristics value) { this.loopCharacteristics = value; } /** * Gets the value of the isForCompensation property. * * @return * possible object is * {@link Boolean } * */ public boolean isForCompensation() { if (isForCompensation == null) { return false; } else { return isForCompensation; } } /** * Sets the value of the isForCompensation property. * * @param value * allowed object is * {@link Boolean } * */ public void setIsForCompensation(Boolean value) { this.isForCompensation = value; } /** * Gets the value of the startQuantity property. * * @return * possible object is * {@link BigInteger } * */ public BigInteger getStartQuantity() { if (startQuantity == null) { return new BigInteger("1"); } else { return startQuantity; } } /** * Sets the value of the startQuantity property. * * @param value * allowed object is * {@link BigInteger } * */ public void setStartQuantity(BigInteger value) { this.startQuantity = value; } /** * Gets the value of the completionQuantity property. * * @return * possible object is * {@link BigInteger } * */ public BigInteger getCompletionQuantity() { if (completionQuantity == null) { return new BigInteger("1"); } else { return completionQuantity; } } /** * Sets the value of the completionQuantity property. * * @param value * allowed object is * {@link BigInteger } * */ public void setCompletionQuantity(BigInteger value) { this.completionQuantity = value; } /** * Gets the value of the default property. * * @return * possible object is * {@link Object } * */ public Object getDefault() { return _default; } /** * Sets the value of the default property. * * @param value * allowed object is * {@link Object } * */ public void setDefault(Object value) { this._default = value; } /** * @return the inputSetInfo */ public List<HashMap<String, IoOption>> getInputSetInfo() { if(this.inputSetInfo == null) this.inputSetInfo = new ArrayList<HashMap<String,IoOption>>(); return inputSetInfo; } /** * @return the outputSetInfo */ public List<HashMap<String, IoOption>> getOutputSetInfo() { if(this.outputSetInfo == null) this.outputSetInfo = new ArrayList<HashMap<String,IoOption>>(); return outputSetInfo; } public List<BoundaryEvent> getAttachedBoundaryEvents() { if(attachedBoundaryEvents == null) { attachedBoundaryEvents = new ArrayList<BoundaryEvent>(); } return attachedBoundaryEvents; } public void acceptVisitor(Visitor v){ v.visitActivity(this); } }